package com.atguigu.gmall.product.service.impl;

import com.atguigu.gmall.product.entity.*;
import com.atguigu.gmall.product.mapper.SpuSaleAttrMapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.google.common.collect.Lists;

import com.atguigu.gmall.product.service.SpuImageService;
import com.atguigu.gmall.product.service.SpuSaleAttrService;
import com.atguigu.gmall.product.service.SpuSaleAttrValueService;
import com.atguigu.gmall.product.vo.SpuInfoVo;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.atguigu.gmall.product.service.SpuInfoService;
import com.atguigu.gmall.product.mapper.SpuInfoMapper;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author weiranyi
 * @description 针对表【spu_info(商品表)】的数据库操作Service实现
 * @createDate 2022-11-29 16:41:29
 */
@Service
public class SpuInfoServiceImpl extends ServiceImpl<SpuInfoMapper, SpuInfo>
        implements SpuInfoService {
    @Autowired
    SpuSaleAttrService spuSaleAttrService;
    @Autowired
    SpuSaleAttrValueService spuSaleAttrValueService;
    @Autowired
    SpuImageService spuImageService;
    @Autowired
    SpuSaleAttrMapper spuSaleAttrMapper;

    @Override
    public Page<SpuInfo> getSpuList(Long pn, Long ps, Long c3id) {
        Page<SpuInfo> page = new Page<>(pn, ps);
        LambdaQueryWrapper<SpuInfo> wrapper = new LambdaQueryWrapper<SpuInfo>().eq(SpuInfo::getCategory3Id, c3id);
        this.page(page, wrapper);
        return page;
    }

    @Transactional
    @Override
    public void saveSpuInfo(SpuInfoVo spuInfoVo) {
        //1.基本信息保存到spu_info
        SpuInfo spuInfo = new SpuInfo();
        BeanUtils.copyProperties(spuInfoVo, spuInfo);
        this.save(spuInfo);

        Long spuId = spuInfo.getId(); // 得到自增的id

        //2.spuSaleAttrList ->
        List<SpuInfoVo.SpuSaleAttrListDTO> spuSaleAttrList = spuInfoVo.getSpuSaleAttrList();
//        // 销售属性名spu_sale_attr
//        List<SpuSaleAttr> spuSaleAttrs = new ArrayList<>();
//        // 销售属性值spu_sale_attr_value
//        List<SpuSaleAttrValue> spuSaleAttrValues = new ArrayList<>();
//        for (SpuInfoVo.SpuSaleAttrListDTO spuSaleAttrDTO : spuSaleAttrList) {
//            // 销售属性信息
//            SpuSaleAttr spuSaleAttr = new SpuSaleAttr();
//            BeanUtils.copyProperties(spuSaleAttrDTO, spuSaleAttr);
//            spuSaleAttr.setSpuId(spuId);
//            spuSaleAttrs.add(spuSaleAttr);
//            // 销售属性值信息
//            for (SpuInfoVo.SpuSaleAttrListDTO.SpuSaleAttrValueListDTO spuSaleAttrValueListDTO : spuSaleAttrDTO.getSpuSaleAttrValueList()) {
//                SpuSaleAttrValue spuSaleAttrValue = new SpuSaleAttrValue();
//                BeanUtils.copyProperties(spuSaleAttrValueListDTO, spuSaleAttrValue);
//                spuSaleAttrValue.setSpuId(spuId);
//                spuSaleAttrValue.setSaleAttrName(spuSaleAttrDTO.getSaleAttrName());
//                spuSaleAttrValues.add(spuSaleAttrValue);
//            }
//        }
        // streamAPI改造
        List<SpuSaleAttr> spuSaleAttrs = spuSaleAttrList.stream().map(item -> {
            // 销售属性信息
            SpuSaleAttr spuSaleAttr = new SpuSaleAttr();
            BeanUtils.copyProperties(item, spuSaleAttr);
            spuSaleAttr.setSpuId(spuId);
            return spuSaleAttr;
        }).collect(Collectors.toList());

        spuSaleAttrService.saveBatch(spuSaleAttrs);
        List<SpuSaleAttrValue> spuSaleAttrValues = spuSaleAttrList
                .stream()
                .flatMap(item -> {
                    return item
                            .getSpuSaleAttrValueList()
                            .stream()
                            .map(val -> {
                                SpuSaleAttrValue spuSaleAttrValue = new SpuSaleAttrValue();
                                spuSaleAttrValue.setSpuId(spuId);
                                spuSaleAttrValue.setBaseSaleAttrId(val.getBaseSaleAttrId());
                                spuSaleAttrValue.setSaleAttrValueName(val.getSaleAttrValueName());
                                spuSaleAttrValue.setSaleAttrName(item.getSaleAttrName());
                                return spuSaleAttrValue;
                            });
                }).collect(Collectors.toList());
        spuSaleAttrValueService.saveBatch(spuSaleAttrValues);

        //3.spuImageList -> spu_image
        List<SpuInfoVo.SpuImageListDTO> spuImageList = spuInfoVo.getSpuImageList();
//        ArrayList<SpuImage> spuImages = new ArrayList<>();
//        for (SpuInfoVo.SpuImageListDTO imageDTO : spuImageList) {
//            SpuImage spuImage = new SpuImage();
//            BeanUtils.copyProperties(imageDTO, spuImage);
//            // 回填id
//            spuImage.setSpuId(spuId);
//            spuImages.add(spuImage);
//        }
        // streamAPI改造
        List<SpuImage> spuImages = spuImageList.stream().map(item -> {
            SpuImage spuImage = new SpuImage();
            BeanUtils.copyProperties(item, spuImage);
            // 回填id
            spuImage.setSpuId(spuId);
            return spuImage;
        }).collect(Collectors.toList());
        spuImageService.saveBatch(spuImages);
    }

    @Override
    public List<SpuImage> getSpuImageList(Long spuId) {
        LambdaQueryWrapper<SpuImage> wrapper = new LambdaQueryWrapper<SpuImage>().eq(SpuImage::getSpuId, spuId);
        List<SpuImage> list = spuImageService.list(wrapper);
        return list;
    }

    @Override
    public List<SpuSaleAttr> getSpuSaleAttrList(Long spuId) {
        return spuSaleAttrMapper.getSpuSaleAttrAndSaleAttrValueList(spuId);
    }
}




